package JVM;

/**
 * @time: 2019/12/6 11:05
 * @author: baozi
 */

// linux 命令
/* mkdir+name  建立文件夹 vim+name 建立文件
   java -X 看非标准参数

  -Xint 解释模式: 执行所有字节码
  -Xcomp 编译模式:第一次先编译本地代码 再执行
  -Xmixed 混合模式 默认的 。自己选择上面的模式执行

  -XX 用于jvm参数调整 调优或debug
  boolean型
  -XX-或+name 启用禁用属性
  例 -XX+DisableExplicitGC 禁用System.gc() 代码执行GC

  非boolean型
  -XX:<name>=<value> 设置 name的职位value name为
例 -XX:NewRatio=1 设置新生代老年代比值

  -Xms 堆初始大小 -Xmx 堆最大大小 例：jav -Xms12m 出事堆大小12兆

    java -XX:+PrintFlagsFinal jvmDemo1 打印jvm运行的参数

     ps -ef|grep tomcat 更具名字看进程
     jps  看所有java程序的进程
     jps -l 看所有java程序的进程, -l显示全包路径
     jinfo -flags <进程id> 查看所有参数
     jinfo -flag <name> <进程id> 查看单个属性参数

   内存模型：
   jdk1.7
   堆分为：
    年轻代分 eden区 Survivor区2个一样，一个备用
    老年代分
    永久代

   jdk1.8
    堆分为：
    年轻代分 eden区 Survivor区2个一样，一个备用
    老年代分

    元数据空间(替代永久代,不在堆): ccs codecache

    jstat <命令> <进程id> 看堆使用情况
    例 jstat -class 20123: loaded 加载class的数量 Bytes 占用大小 Unloaded 未加载class的数量 Bytes 未占用大小 time时间
    例 jstat -compiler 20123 看编译情况
    例 jstat -gc 20123 看内存使用情况 后面加  jstat -gc 20123 1000 10 每1秒打印，总共打印10次

    jmap -heap <进程id> 看内存使用情况

    jmap -histo <进程id> 看改进程内所有对象数量  jmap -histo <进程id> | more 分开看看改进程内对象数量
    jmap -dump:format=b,file=<路径> <进程id> 把数据导出到文件里
    jhat -port <端口> <路径> 把文件生成服务 指定端口可以查看

    Mixed GC:当老年代里的对象占了一定大小触发,m默认45% 步骤：
           1全局并发标记
             初始标记->跟区域扫描->并发标记->重新标记->清楚垃圾
           2 拷贝存货活对象

   jstack <进程ip> 看线程状态
        线程状态: 初始态(new)
                 运行态(runnable)
                   就绪态(ready)
                   运行态(running)
                 阻塞态(blocked)
                 等待态(wating)
                 超时等待(time_wating)
                 终止态

    VisualVM 工具 可以看上面所有
 * */

public class jvmDemo1 {

    //下面死锁案例
    private static Object obj1=new Object();
    private static Object obj2=new Object();

    private static class Thread1 implements Runnable{
        @Override
        public void run(){
            synchronized (obj1){
                System.out.println(" Thread1 get obj1");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2){
                    System.out.println(" Thread1 get obj2");
                }
            }
        }
    }
    private static class Thread2 implements Runnable{
        @Override
        public void run(){
            synchronized (obj2){
                System.out.println(" Thread2 get obj2");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1){
                    System.out.println(" Thread2 get obj1");
                }
            }
        }
    }

    public static void main(String[] args) {
        new Thread(new Thread1()).start();
        new Thread(new Thread2()).start();
        /*String str=System.getProperty("str");
        if(str!=null){
            System.out.println(str);
        }else{
            System.out.println("is null");
        }*/
    }

}
